/*
* MIT License

* Copyright (c) 2017 极光开发者

* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:

* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.

* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

var JPushPlugin = function() {};

// private plugin function

JPushPlugin.prototype.receiveMessage = {};
JPushPlugin.prototype.openNotification = {};
JPushPlugin.prototype.receiveNotification = {};

JPushPlugin.prototype.isPlatformIOS = function() {
  return (
    device.platform === "iPhone" ||
    device.platform === "iPad" ||
    device.platform === "iPod touch" ||
    device.platform === "iOS"
  );
};

JPushPlugin.prototype.errorCallback = function(msg) {
  console.log("JPush Callback Error: " + msg);
};

JPushPlugin.prototype.callNative = function(
  name,
  args,
  successCallback,
  errorCallback
) {
  if (errorCallback) {
    cordova.exec(successCallback, errorCallback, "JPushPlugin", name, args);
  } else {
    cordova.exec(
      successCallback,
      this.errorCallback,
      "JPushPlugin",
      name,
      args
    );
  }
};

// Common methods
JPushPlugin.prototype.init = function() {
  if (this.isPlatformIOS()) {
    this.callNative("initial", [], null);
  } else {
    this.callNative("init", [], null);
  }
};

JPushPlugin.prototype.setDebugMode = function(mode) {
  this.callNative("setDebugMode", [mode], null);
};

JPushPlugin.prototype.getRegistrationID = function(successCallback) {
  this.callNative("getRegistrationID", [], successCallback);
};

JPushPlugin.prototype.stopPush = function(successCallback) {
  this.callNative("stopPush", [], successCallback);
};

JPushPlugin.prototype.resumePush = function(successCallback) {
  this.callNative("resumePush", [], successCallback);
};

JPushPlugin.prototype.isPushStopped = function(successCallback) {
  this.callNative("isPushStopped", [], successCallback);
};

/**
 * 设置标签。
 * 注意：该接口是覆盖逻辑，而不是增量逻辑。即新的调用会覆盖之前的设置。
 *
 * @param params = { 'sequence': number, 'tags': ['tag1', 'tag2'] }
 */
JPushPlugin.prototype.setTags = function(
  params,
  successCallback,
  errorCallback
) {
  this.callNative("setTags", [params], successCallback, errorCallback);
};

/**
 * 新增标签。
 *
 * @param params = { 'sequence': number, 'tags': ['tag1', 'tag2'] }
 */
JPushPlugin.prototype.addTags = function(
  params,
  successCallback,
  errorCallback
) {
  this.callNative("addTags", [params], successCallback, errorCallback);
};

/**
 * 删除指定标签。
 *
 * @param params = { 'sequence': number, 'tags': ['tag1', 'tag2'] }
 */
JPushPlugin.prototype.deleteTags = function(
  params,
  successCallback,
  errorCallback
) {
  this.callNative("deleteTags", [params], successCallback, errorCallback);
};

/**
 * 清除所有标签。
 *
 * @param params = { 'sequence': number }
 */
JPushPlugin.prototype.cleanTags = function(
  params,
  successCallback,
  errorCallback
) {
  this.callNative("cleanTags", [params], successCallback, errorCallback);
};

/**
 * 查询所有标签。
 *
 * @param params = { 'sequence': number }
 */
JPushPlugin.prototype.getAllTags = function(
  params,
  successCallback,
  errorCallback
) {
  this.callNative("getAllTags", [params], successCallback, errorCallback);
};

/**
 * 查询指定标签与当前用户的绑定状态。
 *
 * @param params = { 'sequence': number, 'tag': string }
 */
JPushPlugin.prototype.checkTagBindState = function(
  params,
  successCallback,
  errorCallback
) {
  this.callNative(
    "checkTagBindState",
    [params],
    successCallback,
    errorCallback
  );
};

/**
 * 设置别名。
 * 注意：该接口是覆盖逻辑，而不是增量逻辑。即新的调用会覆盖之前的设置。
 *
 * @param params = { 'sequence': number, 'alias': string }
 */
JPushPlugin.prototype.setAlias = function(
  params,
  successCallback,
  errorCallback
) {
  this.callNative("setAlias", [params], successCallback, errorCallback);
};

/**
 * 删除别名。
 *
 * @param params = { 'sequence': number }
 */
JPushPlugin.prototype.deleteAlias = function(
  params,
  successCallback,
  errorCallback
) {
  this.callNative("deleteAlias", [params], successCallback, errorCallback);
};

/**
 * 查询当前绑定的别名。
 *
 * @param params = { 'sequence': number }
 */
JPushPlugin.prototype.getAlias = function(
  params,
  successCallback,
  errorCallback
) {
  this.callNative("getAlias", [params], successCallback, errorCallback);
};



JPushPlugin.prototype.receiveRegistrationIdInAndroidCallback = function(data) {
 // if (device.platform === "Android") {
    data = JSON.stringify(data);
    var event = JSON.parse(data);
    cordova.fireDocumentEvent("jpush.receiveRegistrationId", event);
 // }
};

JPushPlugin.prototype.receiveMessageInAndroidCallback = function(data) {
  data = JSON.stringify(data);
  this.receiveMessage = JSON.parse(data);
  cordova.fireDocumentEvent("jpush.receiveMessage", this.receiveMessage);
};
JPushPlugin.prototype.receiveInAppMessageClickCallback = function(data) {
 // if (device.platform === "Android") {
      data = JSON.stringify(data);
      this.receiveMessage = JSON.parse(data);
      cordova.fireDocumentEvent("jpush.receiveInAppMessageClick", this.receiveMessage);
//  }
};
JPushPlugin.prototype.receiveInAppMessageShowCallback = function(data) {
  if (device.platform === "Android") {
      data = JSON.stringify(data);
      this.receiveMessage = JSON.parse(data);
      cordova.fireDocumentEvent("jpush.receiveInAppMessageShow", this.receiveMessage);
  }
};

JPushPlugin.prototype.openNotificationInAndroidCallback = function(data) {
  data = JSON.stringify(data);
  this.openNotification = JSON.parse(data);
  cordova.fireDocumentEvent("jpush.openNotification", this.openNotification);
};

JPushPlugin.prototype.receiveNotificationInAndroidCallback = function(data) {
  data = JSON.stringify(data);
  this.receiveNotification = JSON.parse(data);
  cordova.fireDocumentEvent(
    "jpush.receiveNotification",
    this.receiveNotification
  );
};

JPushPlugin.prototype.clearAllNotification = function() {
 // if (device.platform === "Android") {
    this.callNative("clearAllNotification", [], null);
 // }
};

JPushPlugin.prototype.clearNotificationById = function(id) {
 // if (device.platform === "Android") {
    this.callNative("clearNotificationById", [id], null);
 // }
};

JPushPlugin.prototype.setLatestNotificationNum = function(num) {
  if (device.platform === "Android") {
    this.callNative("setLatestNotificationNum", [num], null);
  }
};

/**
 * 设置手机号。
 *
 * @param params = { 'sequence': number, 'mobileNumber': string }
 */
 JPushPlugin.prototype.setMobileNumber = function(
  params,
  successCallback,
  errorCallback
) {
     this.callNative("setMobileNumber", [params], successCallback, errorCallback);

};

if (!window.plugins) {
  window.plugins = {};
}

if (!window.plugins.jPushPlugin) {
  window.plugins.jPushPlugin = new JPushPlugin();
}

module.exports = new JPushPlugin();

